/* ===================================================================== */
function block_window(){
	
	if($( document.activeElement ).is(':focus'))
		$(document.activeElement).blur();
	var y_max = $(document).height();
	var x_max = $(document).width();
	$('#blocker').css('height', y_max);
	$('#blocker').css('width', x_max);
	$('#blocker').fadeTo(0, 0.5);
}
/* ===================================================================== */
function unblock_window(){
	
	$('#blocker').fadeTo(700, 0);
	$('#blocker').hide();
}
/* ===================================================================== */
/* sirve para tranformar en string un obj o array de manera recursiva */
function obj_str(obj, prefix, recurse){
	
	if(! prefix) prefix = '  ';
	if(! recurse) recurse = 1;
	if(recurse > 10) return prefix+' limit recurse:'+obj;
	var aux;
	var str = '['+typeof obj+']';
	prefix += '   ';
	if(typeof obj == 'string'){
		str += prefix+obj;
	}
	else{
		for(aux in obj){
			str += '\n'+prefix+'['+aux+'] => ';
			if(typeof obj[aux] == 'object'){
				recurse++;
				if(obj[aux] == null)
					str += '[NULL]';
				else
					str += obj_str(obj[aux], prefix+'  ', recurse);
			}
			else{
				str += ''+obj[aux];
			}
		}
	}
	return str;
}
/* ===================================================================== */
/**
 * permite mover los option de un select a otro
 * o demtro del mismo select, cambiarle la posicion
*/
function move_select_item(from, to, amount){
	var i;
	if( (from == to) && (from != '') ){
		/* moviendo un elemento dentro del mismo select */
		if( amount < 0 ){
			for(i=0; i > amount; i--){
				$('#'+from+' option:selected').each(
					function(){$(this).insertBefore( $(this).prev() )}
				);
			}
		}
		else if( amount > 0 ){
			for(i=0; i < amount; i++){
				$('#'+from+' option:selected').each(
					function(){$(this).insertAfter( $(this).next() )}
				);
			}
		}
	}
	else if( (from) && (to) ){
		var obj_from = document.getElementById(from);
		var obj_to = document.getElementById(to);
		
		for(i=0;i < obj_from.options.length; i++){
			if(obj_from.options[i].selected){
				var oOption = document.createElement("OPTION");
				obj_to.options.add(oOption);
				oOption.text = obj_from.options[i].text;
				oOption.value = obj_from.options[i].value;
				obj_from.options[i] = null;
				//	tengo que decrementar el indice, porque al 
				//	asignarle null se achica la long y se corren los indices	
				i--;
			}
		}
	}
	else{
		// error 
		alert('no pude mover las opciones: param "'+from+'"  "'+to+'"  "'+amount+'"');
	}
}
/* ===================================================================== */
/*	devuelve un array con los values de los options del combo pasado por param */
function get_options_values(obj){
	var aux = new Array();
	if((obj.type == 'select-multiple') || (obj.type == 'select-one')){
		var i;
		for(i=0;i < obj.options.length; i++){
			aux.push(obj.options[i].value);
		}
	}
	else{
		alert('get_options_values => el obj ('+obj.id+') no es un combo :'+obj.type);
		return false;
	}
	return aux;
}
/* ===================================================================== */
/* recibe un selector de jquery (de un combo) y le saca todos los option y
 * los reemplaza por los que recibe por param 
 * el obj_options es un array de obj array[{val:'id1', text:'desc1'}, {val:'id2', text:'desc2'}]*/
function assign_options(selector, obj_options){
	$(''+selector).empty();$.each(obj_options, function(i, obj_opt){$(''+selector).append($('<option></option>').val(obj_opt.val).html(obj_opt.text));});
}
/* ===================================================================== */
/* ===================================================================== */


/* ===================================================================== */
/* ===================================================================== */
/**
 * crea el autocomplete de JQuery
 * url_param: url para la llamada ajax
 * identity_param : identity del componente view
 * field_param : nombre del field por el que se esta filtrando
 * input_param : selector del input que hay que convertir en autocomplete
 * min_len_param : minima cantidad de caracteres para realizar la busqueda
 * delay_param : delay entre la pulsacion de una tecla y la busqueda
 * name_input_param : nombre del input, para poder recuperarlo de la cache
 * fields_description : array de nombre de los inputs text que forman este autocomplete
 * input_hidden_id : hidden que mantiene el id del registro seleccionado
 * allow_custom_value : si es true, permite que cargue un string que no esta en la base (no tiene un registro asociado)
 * custom_param : parametro opcional que se pasa a la request, puede ser un value o un function, en ese caso, se pasa como parametro el valor de retorno de la funcion
 */
function ac_create(url_param, identity_param, field_param, input_param, min_len_param, delay_param, name_input_param, fields_description, input_hidden_id, allow_custom_value, custom_param){
	
	
	$(input_param).autocomplete({
		source: function(request, response){
			var extra_param;
			if(typeof custom_param == 'function')
				extra_param = custom_param();
			else
				extra_param = custom_param;
			$.ajax({
					type:'POST',
					url: ""+url_param,
					dataType: "json",
					data: {
						identity:''+identity_param,
						method: 'autocomplete_items',
						param : {
							term:request.term,
							field:''+field_param,
							name_input:name_input_param,
							custom_param:extra_param
						}
					},
					success: function(data){
						response(data);
					}
				});
		},
		minLength: min_len_param,
		delay: delay_param,
		select: function(event, ui){
			ac_copy_field(ui.item, fields_description, identity_param, name_input_param);
			$('#'+input_hidden_id).val( ac_get_field(ui.item ,'id') );
			$('.'+name_input_param+':last', input_param).focus();
			return false;
		},
		change: function(event, ui){
			if(allow_custom_value){
				var aux = ac_get_field(ui.item ,field_param);
				if(aux){ ac_copy_field(ui.item, fields_description, identity_param, name_input_param); }
				else{
					/*
					 * esto hace que se dispare otro evento CHANGE, y borra todo el autocomplete
					 * (si tiene mas de un campo)
					var aux2 = $(input_param).val();
					$('#div_'+identity_param+' .'+name_input_param).val('');
					$(input_param).val(aux2);
					*/
				}
			}
			else{ ac_copy_field(ui.item, fields_description, identity_param, name_input_param); }
			$('#'+input_hidden_id).val( ac_get_field(ui.item ,'id') );
			$('.'+name_input_param+':last', input_param).focus();
			return false;
		},
		focus:function(event,ui){
			if(allow_custom_value){
				var aux = ac_get_field(ui.item ,field_param);
				if(aux) $(input_param).val( aux );
			}
			else{ $(input_param).val( ac_get_field(ui.item ,field_param) ); }
			return false;
		}
	}).data("ui-autocomplete")._renderItem=function(a,b){return $("<li>").append("<a>"+ac_get_field(b ,field_param)+"</a>").appendTo(a);};
	
}
/* ===================================================================== */
/* devuelve el valor del atributo pasado (field_name)  */
function ac_get_field(obj,field_name){if(is_set(obj) && obj && is_set(obj[field_name])){return obj[field_name];} return '';}
/* ===================================================================== */
/**
 * AUTOCOMPLETE: copia los valores devueltos en el obj a los input
*/
function ac_copy_field(item, fields_description, identity_param, name_input_param, input_ignore){
	
	var i,v,k,str;
	var view = $('#div_'+identity_param);
	var input;
	
	for(i in fields_description){
		v = fields_description[i];
		k = ac_get_field(item, v);
		str = v.replace(/\\/g,"\\\\");
		input = $('.'+name_input_param+'[data-field-orm="'+str+'"]', view);
		if(input_ignore && (input_ignore.attr('id') == input.attr('id'))){
			alert(' salteando '+input_ignore.attr('name'));
			continue;
		}
		input.val(k);
	}
	
}
/* ===================================================================== */
/* ===================================================================== */








/* ===================================================================== */
/* ===================================================================== */
/**
* muestra un mensaje con estilo ERROR, usa a full jquery
* usa un div como contenedor, si no existe lo crea
* NO SE PUEDEN SUPERPONER ESTAS VENTANAS, PORQUE USA UN SOLO DIV, O SEA QUE SE PUEDE LLAMAR UNA SOLA VEZ
*/
function alert_error(msj, timeout_msj){
	
	if( document.getElementById('div_alert_error') ){
		$('#div_alert_error').dialog('destroy');
		$('#div_alert_error').remove();
		$('#div_alert_error_container').remove();
	}
	
	$('<div id="div_alert_error_container" class="ui-widget"></div>').appendTo('body');
	$('<div id="div_alert_error"></div>').appendTo('#div_alert_error_container');
	$('#div_alert_error').text(msj);
	$('#div_alert_error').html('<p><span class="ui-icon ui-icon-alert" style="float:left; margin: 0 7px 20px 0;"></span><p><pre>'+$('#div_alert_error').html()+'</pre></p></p>');
	$('#div_alert_error').dialog({autoOpen: true, modal: true, bgiframe: true, width:900,
									dialogClass:'ui-state-error ui-corner-all',
									closeOnEscape:false, 
									close: function(event, ui){ $('.ui-state-error:first').focus(); },
									title: 'Error'
				})
	$('#div_alert_error').parent().keyup( function(eventObject){ if(is_escape(eventObject)) $('#div_alert_error').dialog('close'); return false;} );
	
	$('a.ui-dialog-titlebar-close').remove();
	$('button.ui-dialog-titlebar-close').remove();
	$('a.btn_close_dialog_custom').remove();
	$('.ui-dialog-titlebar').append('<a class=\"btn_close_dialog_custom cursor_pointer\" style=\"float:right;\"><img src=\"./images/close.png\" /></a>');
	$('.btn_close_dialog_custom').click(function(){ $('#div_alert_error').dialog('close');});
	
	if(timeout_msj){
		setTimeout("$('#div_alert_error').dialog('close');", timeout_msj);
	}
	
}
/* ===================================================================== */
/**
* muestra un mensaje con estilo HIGHLIGHT, usa a full jquery
* usa un div como contenedor, si no existe lo crea
* NO SE PUEDEN SUPERPONER ESTAS VENTANAS, PORQUE USA UN SOLO DIV, O SEA QUE SE PUEDE LLAMAR UNA SOLA VEZ
*/
function alert_msg(msj, timeout_msj){
	
	if( document.getElementById('div_alert_msg') ){
		$('#div_alert_msg').dialog('destroy');
		$('#div_alert_msg').remove();
		$('#div_alert_msg_container').remove();
	}
	
	$('<div id="div_alert_msg_container" class="ui-widget"></div>').appendTo('body');
	$('<div id="div_alert_msg"></div>').appendTo('#div_alert_msg_container');
	$('#div_alert_msg').text(msj);
	$('#div_alert_msg').html('<p><span class="ui-icon ui-icon-info" style="float:left; margin: 0 7px 20px 0;">\
						<p><pre>'+$('#div_alert_msg').html()+'</pre></p></p>');
	$('#div_alert_msg').dialog({autoOpen: true, modal: true, 
								bgiframe: true, 
								width: 900, 
								dialogClass:'ui-state-highlight ui-corner-all', 
								closeOnEscape:false, 
								close: function(event, ui){ $('.ui-state-highlight:first').focus(); },
								title:'Aviso'
					});
	$('#div_alert_msg').parent().keyup( function(eventObject){ if(is_escape(eventObject)) $('#div_alert_msg').dialog('close'); return false;} );
	
	$('a.ui-dialog-titlebar-close').remove();
	$('button.ui-dialog-titlebar-close').remove();
	$('a.btn_close_dialog_custom').remove();
	$('.ui-dialog-titlebar').append('<a class=\"btn_close_dialog_custom cursor_pointer\" style=\"float:right;\"><img src=\"./images/close.png\" /></a>');
	$('.btn_close_dialog_custom').click(function(){ $('#div_alert_msg').dialog('close');});
	
	if(timeout_msj){
		setTimeout("$('#div_alert_msg').dialog('close');", timeout_msj);
	}
}
/* ===================================================================== */
/**
 * solicita confirmacion del usuario, el mensaje tiene estilo HIGHLIGHT, usa a full jquery
 * usa un div como contenedor, si no existe lo crea
 * NO SE PUEDEN SUPERPONER ESTAS VENTANAS, PORQUE USA UN SOLO DIV, O SEA QUE SE PUEDE LLAMAR UNA SOLA VEZ
 * forma de uso:
 * 		alert_confirm( 
 * 			{txt:'acepta esto', func:function(){alert('apreto aceptar');} , msg:'se guardan cosas y eso'},
 * 			{txt:'CANCEL!!!! áñÑ', func:function(){alert('apreto cancelar');}, msg: 'no se hace nada'}
 * 		);
 */
function alert_confirm(obj_accept, obj_cancel){
	
	if( document.getElementById('div_alert_confirm') ){
		$('#div_alert_confirm').dialog('destroy');
		$('#div_alert_confirm').remove();
		$('#div_alert_confirm_container').remove();
		
	}
	
	var txt_accept = 'Aceptar';
	var msg_accept = '';
	var func_accept = function(){$('#div_alert_confirm').dialog( "close" );};
	
	var txt_cancel = 'Cancelar';
	var func_cancel = function(){$('#div_alert_confirm').dialog( "close" );};
	var msg_cancel = '';
	
	if(obj_accept && obj_accept.txt) txt_accept = obj_accept.txt;
	if(obj_accept && obj_accept.msg) msg_accept = '<b>'+txt_accept+'</b> : '+obj_accept.msg;
	if(obj_accept && obj_accept.func) func_accept = function(){var a = obj_accept.func;a();$('#div_alert_confirm').dialog( "close" );};
	
	if(obj_cancel && obj_cancel.txt) txt_cancel = obj_cancel.txt;
	if(obj_cancel && obj_cancel.msg) msg_cancel = '<b>'+txt_cancel+'</b> : '+obj_cancel.msg;
	if(obj_cancel && obj_cancel.func) func_cancel = function(){var a = obj_cancel.func;a();$('#div_alert_confirm').dialog( "close" );};
	
	$('<div id="div_alert_confirm_container" class="ui-widget"></div>').appendTo('body');
	$('<div id="div_alert_confirm"></div>').appendTo('#div_alert_confirm_container');
	$('#div_alert_confirm').html('<p>\
	<span class="ui-icon ui-icon-alert" style="float:left; margin: 0 7px 20px 0;"></span>\
	<p><pre>'+msg_accept+'</pre></p><p><pre>'+msg_cancel+'</pre></p></p>');
	$('#div_alert_confirm').dialog({autoOpen: true, modal: true, bgiframe: true, width: 700, 
									dialogClass:'ui-state-highlight ui-corner-all',
									close: function(event, ui){set_focus();},
									title:'Confirmar Acción'
			});
	$('#div_alert_confirm').dialog( "option", "buttons",[ {text: txt_accept, click: func_accept},  {text: txt_cancel, click: func_cancel}]);
	var aux = $('#div_alert_confirm').parent();
	$('.ui-dialog-buttonpane', aux).removeClass('ui-widget-content');
	
	$('a.ui-dialog-titlebar-close').remove();
	$('button.ui-dialog-titlebar-close').remove();
	$('a.btn_close_dialog_custom').remove();
	$('.ui-dialog-titlebar').append('<a class=\"btn_close_dialog_custom cursor_pointer\" style=\"float:right;\"><img src=\"./images/close.png\" /></a>');
	$('.btn_close_dialog_custom').click(function(){ $('#div_alert_confirm').dialog('close');});
	
}
/* TEST
var obj_accept = {txt:'aceptar!', msg:"esta seguro\n pero re seguro seguro?"};
var obj_cancel = {txt:'cancelar:(', msg:"no se que quiero hacer\n apretar cancelar\n aca"};
$(function(){ alert_confirm(obj_accept, obj_cancel); });
*/
/* ===================================================================== */
/* le aplica un estilo al input para resaltar el error */
function highlight_error(selector, level){
	
	if(level && (level == 2))
		$(''+selector).addClass('ui-state-highlight').change( function(evt){unhighlight_error('#'+this.id, level);} );
	else
		$(''+selector).addClass('ui-state-error').change( function(evt){unhighlight_error('#'+this.id, level);} );
}
/* ===================================================================== */
/* le saca el estilo resaltado al input para resaltar el error */
function unhighlight_error(selector, level){
	if(level && (level == 2))
		$(''+selector).removeClass('ui-state-highlight');
	else
		$(''+selector).removeClass('ui-state-error');
}
/* ===================================================================== */
function set_focus(selector){
	
	if(selector && $(''+selector).get(0) ){
		var aux = $(''+selector).attr('id');
		if( aux && $('#'+aux).focus ){
			$('#'+aux).focus();
			if(document.getElementById('main_focus_default'))
				document.getElementById('main_focus_default').value = aux;
			return ;
		}
	}
	
	if(document.getElementById('main_focus_default') && document.getElementById('main_focus_default').value){
		if(document.getElementById(document.getElementById('main_focus_default').value).focus){
			document.getElementById(document.getElementById('main_focus_default').value).focus();
			return;
		}
	}
	
	$('#div_main :input:enabled:visible:first').focus();
	
}
/* ===================================================================== */
/*







PROCESAMIENTO DE FORMULARIOS



*/
/*============================================================================*/
/*	busca los datos de los formularios recursivamente hacia los padres del que llama */
function gc_get_form_data_parent(obj_view, selector, data){
	
	if(! data) data = {};
	var identity = obj_view.identity;
	var parent_id = obj_view.parent_form;
	if(! selector) selector = '';
	
	var id_row = obj_view.id_row;
	var filter='#div_'+identity+' .'+identity;
	if(id_row)
		filter += '[data-id-row="'+id_row+'"]';
	
	$(filter+selector).each(function (i){
		var input = $(this);
		if(input.prop('disabled')) return;
		var aux = input.get_value();
		var orm_field = input.attr('data-chain-orm');
		if(! orm_field) orm_field = identity+'|'+input.attr('name');
		gc_insert_data(data, orm_field, aux);
	});
	
	if(parent_id){
		var obj_view_parent = eval('gc_obj_view_'+parent_id);
		if(obj_view_parent && obj_view_parent.identity)
			gc_get_form_data_parent(obj_view_parent, selector, data);
	}
}
/*============================================================================*/
/*	busca los datos de los formularios recursivamente hacia los hijos del que llama */
function gc_get_form_data_child(obj_view, selector, data){
	
	if(! data) data = {};
	var identity = obj_view.identity;
	var childs_id = obj_view.childs_form;
	if(! selector) selector = '';
	
	
	if(childs_id){
		var i; var child_id; var obj_view_child; var input; var aux; var orm_field; var orm_id;
		for(i in childs_id){
			child_id = childs_id[i];
			obj_view_child = eval('gc_obj_view_'+child_id);
			
			var id_row = obj_view_child.id_row;
			var filter='#div_'+child_id+' .'+child_id;
			if(id_row)
				filter += '[data-id-row="'+id_row+'"]';
			
			$(filter+selector).each(function (i){
				input = $(this);
				if(input.prop('disabled')) return;
				aux = input.get_value();
				orm_field = input.attr('data-chain-orm');
				orm_id = input.attr('data-id-orm');
				if(! orm_field) orm_field = child_id+'|'+input.attr('name');
				if(orm_id || gc_change_iv(obj_view_child, orm_field, aux)) gc_insert_data(data, orm_field, aux);
			});
			if(obj_view_child && obj_view_child.childs_form) gc_get_form_data_child(obj_view_child, selector, data);
		}
	}
}
/*============================================================================*/
function gc_get_form_data_if_change(obj_view, selector, data){
	
	if(! data) data = {};
	var identity = obj_view.identity;
	if(! selector) selector = '';
	
	var id_row = obj_view.id_row;
	var filter='#div_'+identity+' .'+identity;
	if(id_row)
		filter += '[data-id-row="'+id_row+'"]';
	
	$(filter+selector).each(function (i){
		var input = $(this);
		if(input.prop('disabled')) return;
		var aux = input.get_value();
		var orm_field = input.attr('data-chain-orm');
		if(! orm_field) orm_field = input.attr('id')+'|'+input.attr('name');
		if(gc_change_iv(obj_view, orm_field, aux)) gc_insert_data(data, orm_field, aux);
	});
}
/*============================================================================*/
/*	inserta el value del input en la posicion correcta del arbol de acuerdo a la jerarquia de clases
 *	del ORM	*/
function gc_insert_data(data, field_orm, value){
	
	if(! field_orm) field_orm = "";
	var arr_field = field_orm.split("|");
	gc_insert_data_recurse(data, arr_field, value);
	return data;
}
/*============================================================================*/
function gc_insert_data_recurse(data, arr_field, value){
	
	var aux_name;
	if(arr_field.length > 1){
		aux_name = arr_field.shift();
		if(! data[aux_name]) data[aux_name] = {};
		gc_insert_data_recurse(data[aux_name], arr_field, value);
		return data;
	}
	
	aux_name = arr_field.shift();
	if(data[aux_name] != undefined){
		if(! is_array(data[aux_name])){
			var aux = data[aux_name];
			data[aux_name] = new Array();
			data[aux_name].push(aux);
		}
		data[aux_name].push(value);
	}
	else{ data[aux_name] = value; }

	return data;
}
/*============================================================================*/
/*	verifica si el value es distinto al iv definido para ese campo del orm	*/
function gc_change_iv(obj_view, orm_field, value){
	
	var i;
	var aux_iv;
	var aux_orm_field_search = orm_field.replace(/\\\\/g,"\\");
	var aux_str;
	if(obj_view.iv){
		for(i in obj_view.iv){
			aux_iv = obj_view.iv[i];
			aux_str = aux_iv.field_orm.replace(/\\\\/g,"\\");
			if(aux_orm_field_search == aux_str){
				if(value == aux_iv.value){
					//	no hay cambio
					return false;
				}
				else{
					//	cambio el IV
					return true;
				}
			}
		}
		/*	si tiene el atributo iv, pero no esta seteado este input, devuelvo true en caso que tenga value
		 * si no tiene value, devuelvo false
		 */
		var ret=false;
		if(value){
			if(typeof(value) === 'object'){
				var j;
				for(j in value){
					if(value[j]) ret=true;
				}
			}
			else{ ret=true; }
		}
		return ret;
	}
/*	si no tiene el atributo 'iv'  devuelvo true para que lo marque como modificado	*/
	return true;
}
/*============================================================================*/

/*















*/
/* ===================================================================== */
/* hace un merge de dos arrays, si una clave esta en los dos, pisa en el primero el value del segundo	*/
function array_merge(arr_1, arr_2){
	
	var i;var v;
	for( i in arr_2){
		v = arr_2[i];
		if (v !== undefined && typeof(v) !== 'function') {
			arr_1[i] = arr_2[i];
		}
	}
	return arr_1;
}
/* ===================================================================== */
function is_empty(o) {
	var i, v;
	if (typeof(o) === 'object') {
		for (i in o) {
			v = o[i];
			if (v !== undefined && typeof(v) !== 'function') {
				return false;
			}
		}
	}
	return true;
}
/* ===================================================================== */
function is_set(variable){
	
	if(typeof(variable) == "undefined"){
		return false;
	}
	return true;
}
/* ===================================================================== */
function is_array( mixed_var ) {  
	var key = '';  
	if (!mixed_var) {  
		return false;  
	}
	if (typeof mixed_var === 'object') {  
		if (mixed_var.hasOwnProperty) {  
			for (key in mixed_var) {  
				// Checks whether the object has the specified property  
				// if not, we figure it's not an object in the sense of a php-associative-array.  
				if (false === mixed_var.hasOwnProperty(key)) {  
					return false;  
				}  
			}
		}
		/*
		Uncomment to enable strict JavsScript-proof type checking  
		This will not support PHP associative arrays (JavaScript objects), however  
		Read discussion at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_is_array/  
		if (mixed_var.propertyIsEnumerable('length') || typeof mixed_var.length !== 'number') {  
			return false;  
		}
		*/
		return true;  
	}
	return false;  
}
/* ===================================================================== */
function is_object(mixed_var){
	
	return ((mixed_var !== null) && (typeof mixed_var == 'object') && (! is_array(mixed_var)));
}
/* ===================================================================== */
function is_key(event, key_code){
	
	var tecla_apretada;
	if(document.all)
		tecla_apretada=event.keyCode;
	else
		tecla_apretada=event.which;
	
	if(key_code == tecla_apretada){
		return true;
	}
		return false;
		
}
/* ===================================================================== */
function is_enter(event){
	return is_key(event, 13);
}
/* ===================================================================== */
function is_escape(event){
	return is_key(event, 27);
}
/* ===================================================================== */
function is_space(event){
	return is_key(event, 32);
}
/* ===================================================================== */
function is_click(event){
	if(event.type == 'click') return true;
	return false;
}
/* ===================================================================== */
var getUniqueId = (function(){
	var id=0;
	return function(){
		if (arguments[0]==0) id=0;
		return id++;
	}
})();
/* ===================================================================== */














/* ===================================================================== */
/*	estas 3 funciones se usan en las pag de asignacion de permisos
	es por los permisos en binario y eso	*/
/* ===================================================================== */
function combo_select_idx(obj, indice, mark_selected){
	
	var idx_str = new String(indice);
	var seleccionado = false;
	for (var i=0; i<obj.length; i++){
		if(obj.options[i].value == idx_str){
			obj.options[i].selected = mark_selected;
			seleccionado = true;
			if(obj.type == 'select-one')
				break;
		}
	}
	if(! seleccionado){
		obj.options[0].selected = true;
	}
}
/* ===================================================================== */
function combo_select_idx_bin(obj_id, indice){
	
	var obj;obj = $('#'+obj_id).get(0);
	var perm = parseInt(indice, 10);
	var arr_items = new Array();
	var div;
	var mod;
	var salir = false;
	var i;
	var perm_aux;
	var asignado;
	
	if(isNaN(perm)){return;}
	while(!salir){
		div = perm / 2;
		mod = perm % 2;
		if(isNaN(div)){return;}if(isNaN(mod)){return;}
		arr_items.push(mod);
		perm = Math.floor(div);
		if(perm == 0){salir = true;}
	}	//	fin while
	
	asignado = false;
	for(i= arr_items.length -1;i >= 0; i--){
		perm_aux = Math.pow(2,i);
		if(arr_items[i] && perm_aux){
			combo_select_idx(obj, perm_aux, true);
			asignado = true;
		}
		else{
			combo_select_idx(obj, perm_aux, false);
		}
	}
	/*
	 * esto es para cuando el combo tiene la primer option como 'Sel.' sin ningun valor
	 * para que lo deseleccione, pero como yo lo puse multiple y sin opcion '0', no va
	 if(asignado) combo_select_idx(obj, 0, false);
	 */
}
/* ===================================================================== */
function combo_get_value_bin(obj_id){
	
	var obj;obj = $('#'+obj_id).get(0);
	if(! obj) return 0;
	var i;var suma = 0;var aux;
	for(i=0;i<obj.length;i++){
		if(obj.options[i].selected){
			aux = parseInt(obj.options[i].value, 10);
			if(! isNaN(aux))
				suma += aux;
		}
	}
	return suma;
}
/* ===================================================================== */


/* ===================================================================== */
/*	plugin para JQuery que permite definir un metodo get_value y set_value para los inputs 
 ej: $('#id').get(0).get_value = function(){ hace algo para devolver el valor; return valor; };
 */
(function( $ ){
	$.fn.get_value = function() {
		if(this.get(0) && this.get(0).get_value){ return this.get(0).get_value(); }
		else{ var aux=this.val(); if(! aux) return ''; else return aux; }
	};
	$.fn.set_value = function(value) {
		return this.each(function() {        
			var $this = $(this);
			if($this.get(0) && $this.get(0).set_value){ $this.get(0).set_value(value); }
			else{ $this.val(value); }
		});
	};
})( jQuery );
/* ===================================================================== */
/*	extencion para la libreria maskinput para que soporte años < 1900 y mayores a 2099 */
$.extend($.inputmask.defaults.definitions, {
	'Y': { //cualquier año
            validator: "(15|16|17|18|19|20|21|22|23|24|25)\\d{2}",
            cardinality: 4,
            prevalidator: [
                        { validator: "[12]", cardinality: 1 },
                        { validator: "(15|16|17|18|19|20|21|22|23|24|25)", cardinality: 2 },
                        { validator: "(15|16|17|18|19|20|21|22|23|24|25)\\d", cardinality: 3 }
            ]
        }
});
/* ===================================================================== */
/**
 * 
 * @param {string} request_json : url del archivo php que captura la peticion (front controller)
 * @param {array} param : parametros para el service (clase service, metodo, parametros del metodo)
 * @returns {undefined}
 */
function redirect(request_json, param){ 
	$('body').ready(function(){ 
		$.ajax({ 
			type:'POST', 
			url:request_json, 
			async:'true', 
			timeout: 900000, 
			dataType: 'script', 
			data: param
			} )
			.done( function(data, textStatus, jqXHR){ } )
			.fail( function(jqXHR, textStatus, errorThrown) { /*alert('error: '+textStatus+' - '+errorThrown);*/ } );
	});
}